#ifndef __QUEUE_H__
#define __QUEUE_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum {
    from_head = 0,
    from_tail = 1
};

// 定义队列结构体
typedef struct {
    void *data;        // 存放队列元素的数组
    int head;          // 队头索引（最老的节点）
    int tail;          // 队尾索引（下一个插入位置）
    int count;         // 当前队列中元素个数
    int capacity;      // 队列最大容量（最多容纳的元素个数）
    size_t node_size;  // 每个节点数据的大小（单位：字节）
} Queue_t;

Queue_t *queue_init(int capacity, size_t node_size);
void queue_destroy(Queue_t *q);
int queue_enqueue(Queue_t *q, const void *element);
int queue_dequeue(Queue_t *q, void *out_element);
void queue_remove_at(Queue_t *queue, int index);
void *queue_get_node(Queue_t *q, int from_head, int index);
int get_queue_count(Queue_t *q);

#define INIT_QUEUE(queue, size, elem_size, errmsg) \
    do {                                           \
        (queue) = queue_init((size), (elem_size)); \
        if (!(queue)) {                            \
            printf("%s init failed\n", (errmsg));  \
            exit(1);                               \
        }                                          \
    } while (0)

#define SAFE_DESTROY_QUEUE(q) \
    do {                      \
        if (q) {              \
            queue_destroy(q); \
        }                     \
    } while (0)

#endif  // !__QUEUE_H__
